Julia 广播
阐述
标量函数可以以「广播」的形式作用于几个可迭代的实参上,并使用 f.(args...)
或 broadcast(f, args...)
的语法。它有几个特性:
- 标量实参和关键字实参调用方式不变,而向量实参按它的维度逐维展开;
- 如果有多个向量实参,它们的大小应该是一样的;
- 多个广播操作会进行融合
- 可以用
.=
语法将广播的结果直接写到预分配的空间中 - 可以用
@.
的语法一次性把多个操作广播化
内部实现分为两部分:首先用 broadcasted
形成 Broadcasted
中间结构体;然后用 materialize
执行具体的计算。
风格
BroadcastStyle
类型及其子类型用于控制广播的逻辑。
通常来说,Julia 阵列应该对应的是 AbstractArrayStyle{N}
,如果定义了自己的阵列类型则可以创建关于它的子类型。
输出阵列
基于指定的风格,重写
Base.similar(bc::Broadcasted{DestStyle}, ::Type{ElType})
可以生成相应的数组。
实际计算
重写 copyto!(::AbstractArray, ::Broadcasted)
实例
f(x,y) = 3x + 4y
f.(pi, A)
f.(A, B)
@. X = sin(cos(Y))